package com.community.zhihuishequ.utils;

import com.blankj.utilcode.util.StringUtils;

import java.security.MessageDigest;
import java.util.Arrays;

/**
 * 微信数字签名工具类
 */
public class SignatureUtil {

    /**
     * 数字签名是否合法
     *
     * @param url       请求地址
     * @param token     令牌
     * @param timestamp 时间戳
     * @param nonce     随机数
     * @param signature 数字签名
     */
    public static boolean checkSignature(String url, String token, String timestamp, String nonce, String signature) {

        if (StringUtils.isEmpty(token) || StringUtils.isEmpty(signature) || StringUtils.isEmpty(timestamp) || StringUtils.isEmpty(nonce)) {
            return false;
        }

        // 这里的token是个人端登录或注册用户时生成，在需要验证登录的接口中传入此token
        String[] tmpArr = {url, token, timestamp, nonce};

        // 将token、timestamp、nonce三个参数进行字典序排序
        Arrays.sort(tmpArr);

        // 将三个参数字符串拼接成一个字符串
        String tmpStr = ArrayToString(tmpArr);

        tmpStr = SHA1Encode(tmpStr);

        return StringUtils.equalsIgnoreCase(tmpStr, signature);

    }

    /**
     * 生成数字签名字符串
     *
     * @param url       请求地址
     * @param token     令牌 ,个人端登录或注册用户时生成
     * @param timestamp 时间戳
     * @param nonce     随机数
     */
    public static String genSignature(String url, String token, String timestamp, String nonce) {

        if (StringUtils.isEmpty(token) || StringUtils.isEmpty(timestamp) || StringUtils.isEmpty(nonce) || StringUtils.isEmpty(token)) {
            return null;
        }

        String[] tmpArr = {url, token, timestamp, nonce};

        // 将token、timestamp、nonce三个参数进行字典序排序
        Arrays.sort(tmpArr);

        // 将三个参数字符串拼接成一个字符串
        String tmpStr = ArrayToString(tmpArr);

        tmpStr = SHA1Encode(tmpStr);

        return tmpStr;
    }

    // 数组转字符串
    public static String ArrayToString(String[] arr) {
        StringBuilder bf = new StringBuilder();
        for (String str : arr) {
            bf.append(str);
        }
        return bf.toString();
    }

    // 进行sha1加密
    public static String SHA1Encode(String sourceString) {
        String resultString = null;
        try {
            resultString = sourceString;
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            resultString = byte2hexString(md.digest(resultString.getBytes()));
        } catch (Exception ex) {
        }
        return resultString;
    }

    public static String byte2hexString(byte[] bytes) {
        StringBuilder buf = new StringBuilder(bytes.length * 2);
        for (byte aByte : bytes) {
            if (((int) aByte & 0xff) < 0x10) {
                buf.append("0");
            }
            buf.append(Long.toString((int) aByte & 0xff, 16));
        }
        return buf.toString().toLowerCase();
    }
}
